PREDICTION OF NEXT WEEK'S COVID 19 DEATHS BASED ON THIS WEEK'S DATA¶
SACKO Kalil, Master Student at University of applied Science Bochum, major : Computer Science¶
Einleitung¶
Dieses Projekt befasst sich mit der Vorhersage der Todesfälle durch COVID-19 für die kommende Woche, basierend auf den Daten der aktuellen Woche. Es handelt sich um ein Seminarprojekt im Bereich Big Data, das auf einem Kaggle-Wettbewerb basiert. Der Wettbewerb, auf dem dieses Projekt aufbaut, ist unter folgendem Link zu finden: https://www.kaggle.com/competitions/Covid19-Death-Predictions/overview
Das Ziel des Projekts ist es, präzise Vorhersagen zu treffen und gleichzeitig wichtige Einblicke in die Daten zu gewinnen. Hierbei kommen moderne Analysemethoden und maschinelles Lernen zum Einsatz, um die Herausforderungen dieses realen Szenarios zu bewältigen
-------------------------------VORGEHENSWEISE-----------------------------¶
I. EXPLORATORY DATA ANALYSIS¶
Ziel :¶
Die verfügbaren Daten so gut wie möglich verstehen, um eine Modellierungsstrategie zu definieren.
Grundlegende Checkliste (nicht erschöpfend):¶
I-I. Grundlegende Analyse(Analyse der Datenstruktur)¶
- Zielvariable
- Anzahl der Zeilen und Spalten
- Variablentypen
- Descriptive Analyse
- Analyse fehlender Werte
- Analyse der Outliers(Aussreisser)
- Analyse der Verteilungen der Variablen
I-II. Inhaltsanalyse:¶
- Ziel:
Die Beziehungen zwischen den Variablen untersuchen und potenzielle Hypothesen zum Testen identifizieren
- Erkundung der Zielvariable
- Beziehungen zwischen Variablen und Zielvariable
- Beziehungen zwischen unabhängigen Variablen
- Zeitliche und geographische Analyse
- Impfung und Auswirkungen
I-III. Hypothese zum Testen:¶
Nullhypothesen(H0)¶
- Hypothese 1 : Haben die Regionen mit höheren Impfraten wöchentliche Todeszahlen, die niedriger sind?
- Hypothese 2 : Regionen mit höheren COVID-19-Fallzahlen haben höhere Todesraten
- Hypothese 3 : Haben die Regionen mit höheren wöchentlichen Todesraten höhere Todesraten der folgenden Woche
- ETC....
II. PRE-PROCESSING¶
Ziel:¶
Die Daten in ein Format umwandeln, das für Machine Learning geeignet ist.
Grundlegende Checkliste (nicht erschöpfend):¶
- Erstellung des Trainings- und Validierungsdatensatzes
- Encoding
- Entfernung von NaN-Werten: dropna(), Imputation
- Behandlung von Ausreißern, die das Modell negativ beeinflussen
- Feature Selection
- Feature Engineering
- Feature Scaling
III. MODELLING AND TRAINING¶
Ziel:¶
Ein Machine-Learning-Modell entwickeln, das das Endziel erfüllt.
Grundlegende Checkliste (nicht erschöpfend)::¶
- Definition einer Bewertungsfunktion
- Training verschiedener Modelle
- Lernkurve (Learning Curve) und Entscheidungsfindung
- Bestimmtheitmasse
- Fehleranalyse und Rückkehr zum Preprocessing/EDA (optional)
- Optimierung: mit GridSearchCV und/oder RandomizedSearchCV, durch Anwendung von Ensemble-Learners
IV. TESTPHASE¶
- Finaler Test der besten ausgewählten Modelle mit einem neuen Datensatz(testset).
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 111)
pd.set_option('display.max_columns', 111)
data = pd.read_csv('train.csv')
Anzahl der Zeilen und Spalten¶
data
| Id | Location | Weekly Cases | Year | Weekly Cases per Million | Weekly Deaths | Weekly Deaths per Million | Total Vaccinations | People Vaccinated | People Fully Vaccinated | Total Boosters | Daily Vaccinations | Total Vaccinations per Hundred | People Vaccinated per Hundred | People Fully Vaccinated per Hundred | Total Boosters per Hundred | Daily Vaccinations per Hundred | Daily People Vaccinated | Daily People Vaccinated per Hundred | Next Week's Deaths | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 911530868 | World | 2372.0 | 2020 | 0.300 | 65.0 | 0.008 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 344.0 |
| 1 | 807936902 | World | 5023.0 | 2020 | 0.635 | 114.0 | 0.014 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 361.0 |
| 2 | 773590408 | World | 5612.0 | 2020 | 0.710 | 116.0 | 0.015 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 431.0 |
| 3 | 130466459 | World | 7580.0 | 2020 | 0.958 | 153.0 | 0.019 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 463.0 |
| 4 | 544040446 | World | 8983.0 | 2020 | 1.136 | 187.0 | 0.024 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 506.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 129151 | 541829605 | Zimbabwe | 464.0 | 2022 | 29.012 | 13.0 | 0.813 | 11949993.0 | 6297324.0 | 4601845.0 | 1050824.0 | 5665.0 | 74.72 | 39.37 | 28.77 | 6.57 | 354.0 | 1427.0 | 0.009 | 9.0 |
| 129152 | 969939474 | Zimbabwe | 471.0 | 2022 | 29.449 | 12.0 | 0.750 | 11958771.0 | 6299348.0 | 4605821.0 | 1053602.0 | 5295.0 | 74.77 | 39.39 | 28.80 | 6.59 | 331.0 | 1362.0 | 0.009 | 7.0 |
| 129153 | 667902340 | Zimbabwe | 450.0 | 2022 | 28.136 | 13.0 | 0.813 | NaN | NaN | NaN | NaN | 5316.0 | NaN | NaN | NaN | NaN | 332.0 | 1483.0 | 0.009 | 5.0 |
| 129154 | 961193720 | Zimbabwe | 277.0 | 2022 | 17.320 | 6.0 | 0.375 | 11974313.0 | 6305470.0 | 4611113.0 | 1057730.0 | 5358.0 | 74.87 | 39.43 | 28.83 | 6.61 | 335.0 | 1633.0 | 0.010 | 7.0 |
| 129155 | 832612563 | Zimbabwe | 277.0 | 2022 | 17.320 | 6.0 | 0.375 | 11984914.0 | 6310089.0 | 4614738.0 | 1060087.0 | 6190.0 | 74.94 | 39.45 | 28.85 | 6.63 | 387.0 | 2102.0 | 0.013 | 8.0 |
129156 rows × 20 columns
print("Anzahl der Zeilen im Datensatz : ", len(data))
print("Anzahl der Spalten im Datensatz : ", len(data.columns))
Anzahl der Zeilen im Datensatz : 129156 Anzahl der Spalten im Datensatz : 20
Variablentypen¶
#Variablentypen
data.dtypes
Id int64 Location object Weekly Cases float64 Year int64 Weekly Cases per Million float64 Weekly Deaths float64 Weekly Deaths per Million float64 Total Vaccinations float64 People Vaccinated float64 People Fully Vaccinated float64 Total Boosters float64 Daily Vaccinations float64 Total Vaccinations per Hundred float64 People Vaccinated per Hundred float64 People Fully Vaccinated per Hundred float64 Total Boosters per Hundred float64 Daily Vaccinations per Hundred float64 Daily People Vaccinated float64 Daily People Vaccinated per Hundred float64 Next Week's Deaths float64 dtype: object
print(data.dtypes.value_counts())
data.dtypes.value_counts().plot(kind='pie', legend=True, figsize=(8,5))
float64 17 int64 2 object 1 Name: count, dtype: int64
<Axes: ylabel='count'>
Descriptive Analyse¶
#Descriptive Analyse
data.describe()
| Id | Weekly Cases | Year | Weekly Cases per Million | Weekly Deaths | Weekly Deaths per Million | Total Vaccinations | People Vaccinated | People Fully Vaccinated | Total Boosters | Daily Vaccinations | Total Vaccinations per Hundred | People Vaccinated per Hundred | People Fully Vaccinated per Hundred | Total Boosters per Hundred | Daily Vaccinations per Hundred | Daily People Vaccinated | Daily People Vaccinated per Hundred | Next Week's Deaths | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 1.291560e+05 | 1.289430e+05 | 129156.000000 | 128288.000000 | 127898.000000 | 127247.000000 | 4.027000e+04 | 3.842900e+04 | 3.657400e+04 | 1.984700e+04 | 7.784000e+04 | 40270.000000 | 38429.000000 | 36574.000000 | 19847.000000 | 77840.000000 | 7.739100e+04 | 77391.000000 | 129156.000000 |
| mean | 5.502597e+08 | 9.520131e+04 | 2020.912919 | 1379.071563 | 1072.815494 | 10.845384 | 2.450093e+08 | 1.174096e+08 | 9.862264e+07 | 4.365458e+07 | 4.742138e+05 | 89.723652 | 43.424276 | 38.421866 | 20.160324 | 2702.988798 | 1.823430e+05 | 0.114669 | 1064.082776 |
| std | 2.599890e+08 | 6.329716e+05 | 0.739667 | 4013.421702 | 5287.848128 | 24.740908 | 1.032824e+09 | 4.932070e+08 | 4.303844e+08 | 1.862997e+08 | 2.593336e+06 | 74.209648 | 30.074617 | 29.197973 | 22.598973 | 3468.942102 | 1.061855e+06 | 0.202150 | 5251.447471 |
| min | 1.000006e+08 | 0.000000e+00 | 2020.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000e+00 | 0.000000e+00 | 1.000000e+00 | 1.000000e+00 | 0.000000e+00 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000e+00 | 0.000000 | 0.000000 |
| 25% | 3.253421e+08 | 1.040000e+02 | 2020.000000 | 18.291500 | 1.000000 | 0.050000 | 9.900038e+05 | 5.771390e+05 | 4.683338e+05 | 3.894150e+04 | 1.065000e+03 | 18.730000 | 12.810000 | 8.390000 | 0.295000 | 402.000000 | 3.280000e+02 | 0.012000 | 1.000000 |
| 50% | 5.497285e+08 | 1.084000e+03 | 2021.000000 | 188.584000 | 13.000000 | 1.709000 | 7.772026e+06 | 4.306986e+06 | 3.811594e+06 | 1.397130e+06 | 9.182500e+03 | 79.195000 | 46.330000 | 38.515000 | 9.780000 | 1498.000000 | 3.287000e+03 | 0.046000 | 13.000000 |
| 75% | 7.756598e+08 | 9.750000e+03 | 2021.000000 | 1046.367750 | 127.000000 | 10.934000 | 4.976308e+07 | 2.557442e+07 | 2.168825e+07 | 1.114840e+07 | 6.394475e+04 | 146.290000 | 70.380000 | 64.720000 | 36.860000 | 3840.000000 | 2.318000e+04 | 0.141000 | 125.000000 |
| max | 9.999993e+08 | 2.406618e+07 | 2022.000000 | 104220.239000 | 103568.000000 | 1040.710000 | 1.212140e+10 | 5.255161e+09 | 4.816606e+09 | 2.129044e+09 | 4.368841e+07 | 366.870000 | 128.780000 | 126.790000 | 125.850000 | 117862.000000 | 2.099974e+07 | 11.786000 | 102123.000000 |
Asymmetrie:¶
- Die meisten Spalten zeigen eine starke Asymmetrie, was typisch für Daten mit minimalen Werten nahe Null und sehr hohen maximalen Werten (lange Schwanzverteilung) ist. Zum Beispiel:
Weekly Cases, Weekly Deaths, Total Vaccinations, People Vaccinated usw. weisen einen großen Unterschied zwischen dem Median (50%) und dem Durchschnitt (mean) auf. Dies deutet auf eine Asymmetrie nach rechts hin.
- Das Vorhandensein sehr hoher maximaler Werte (z. B. Weekly Cases = 24.066.180 und Weekly Deaths = 103.568) verstärkt die Vorstellung, dass diese Verteilungen nicht symmetrisch sind.
Verteilungen um den Median:¶
- Keine Spalte scheint wirklich gut um den Median verteilt zu sein aufgrund der starken Asymmetrien. Zum Beispiel:
Für Weekly Deaths liegt der Median bei 13, aber der Durchschnitt bei 1072, was den Einfluss einiger extrem hoher Werte zeigt.
- Die Spalte Total Vaccinations per Hundred zeigt einen moderaten Unterschied zwischen dem Median (79.195) und dem Durchschnitt (89.72), was auf eine etwas weniger verzerrte Verteilung hinweist, aber immer noch nicht perfekt symmetrisch ist.
Analyse fehlender Werte¶
#Analyse fehlender Werte
import missingno as msno
plt.figure(figsize=(20, 8))
sns.heatmap(data.isna(), cbar=False)
msno.matrix(data)
<Axes: >
# Prozentzahl der Felhlenden Werte
missing_rate = (data.isna().sum()/data.shape[0])*100
print(missing_rate.sort_values())
missing_rate.sort_values().plot.bar(rot=90, figsize=(10,6), color = 'red')
Id 0.000000 Year 0.000000 Next Week's Deaths 0.000000 Location 0.000000 Weekly Cases 0.164917 Weekly Cases per Million 0.672055 Weekly Deaths 0.974016 Weekly Deaths per Million 1.478058 Daily Vaccinations per Hundred 39.731797 Daily Vaccinations 39.731797 Daily People Vaccinated 40.079439 Daily People Vaccinated per Hundred 40.079439 Total Vaccinations per Hundred 68.820651 Total Vaccinations 68.820651 People Vaccinated 70.246059 People Vaccinated per Hundred 70.246059 People Fully Vaccinated per Hundred 71.682307 People Fully Vaccinated 71.682307 Total Boosters 84.633312 Total Boosters per Hundred 84.633312 dtype: float64
<Axes: >
#Die Spalten, die mehr als 60% der Zeilen enthalten, die NaN Werte enthalten.
missing_groesser_60 = data.columns[missing_rate > 60]
print("Mehr als 60% der Zeilen enthalten Nullwerte\n\n",missing_groesser_60)
print("\n********************************************************************************")
missing_zwischen_39_40 = data.columns[(missing_rate > 38) & (missing_rate < 41)]
print("\nBis 40% der Zeilen enthalten Nullwerte\n\n", missing_zwischen_39_40)
print("\n********************************************************************************")
missing_sehr_klein = data.columns[missing_rate < 1.5]
print("\nEnthalten fast keine Null-Werte\n\n", missing_sehr_klein)
Mehr als 60% der Zeilen enthalten Nullwerte
Index(['Total Vaccinations', 'People Vaccinated', 'People Fully Vaccinated',
'Total Boosters', 'Total Vaccinations per Hundred',
'People Vaccinated per Hundred', 'People Fully Vaccinated per Hundred',
'Total Boosters per Hundred'],
dtype='object')
********************************************************************************
Bis 40% der Zeilen enthalten Nullwerte
Index(['Daily Vaccinations', 'Daily Vaccinations per Hundred',
'Daily People Vaccinated', 'Daily People Vaccinated per Hundred'],
dtype='object')
********************************************************************************
Enthalten fast keine Null-Werte
Index(['Id', 'Location', 'Weekly Cases', 'Year', 'Weekly Cases per Million',
'Weekly Deaths', 'Weekly Deaths per Million', 'Next Week's Deaths'],
dtype='object')
---------------------------------------------------------------------------------------------------------------------¶
Die Spalten 'Total Vaccinations', 'People Vaccinated', 'People Fully Vaccinated','Total Boosters', 'Total Vaccinations per Hundred','People Vaccinated per Hundred', 'People Fully Vaccinated per Hundred' und 'Total Boosters per Hundred' haben NaN(null-)-Werte in mehr als 60% der gesamten Zeilen.
Die Spalten 'Daily Vaccinations', 'Daily Vaccinations per Hundred','Daily People Vaccinated' sowie 'Daily People Vaccinated per Hundred' haben auch Bis 40% von null-Werten.
Die Spalten 'Id', 'Location', 'Weekly Cases', 'Year', 'Weekly Cases per Million','Weekly Deaths', 'Weekly Deaths per Million' und 'Next Week's Deaths' haben fast keine(oder sehr sehr wenige - für die Spalten : *Weekly Cases, Weekly Cases per Million, Weekly Deaths, Weekly Deaths per Million*) null-Werte (0-5%)
Analyse der Ausreisser(Outliers)¶
# BOXPLOT DER SPALTEN
# for col in data.columns:
# if data[col].dtype in ['int64', 'float64']:
# Q1 = data[col].quantile(0.25) # Erstes Quartil
# Q3 = data[col].quantile(0.75) # Drittes Quartil
# median = data[col].median()
# plt.figure(figsize=(8, 5))
# sns.boxplot(data[col], boxprops=dict(facecolor='orange', edgecolor='black'))
# plt.title(f'{col}', fontsize=14)
# # Hinzufügen der statistischen Informationen als text.
# plt.xlabel(f'Q1: {Q1:.2f}, Median: {median:.2f}, Q3: {Q3:.2f}', fontsize=12)
# plt.ylabel('Werte', fontsize=12)
# plt.show()
cols_per_row = 2
num_cols = len([col for col in data.drop(["Location", "Id"], axis=1).columns] )
rows = (num_cols + cols_per_row - 1) // cols_per_row #Berechnung der Anzahl von erforderlichen Zeilen
fig, axes = plt.subplots(rows, cols_per_row, figsize=(12, 5 * rows))
axes = axes.flatten()
for i, col in enumerate(data.drop(["Location", "Id"], axis=1).columns):
Q1 = data[col].quantile(0.25) # erste Quartile
Q3 = data[col].quantile(0.75) # dritte Quartile
median = data[col].median() # Median
sns.boxplot(ax=axes[i], x=data[col], boxprops=dict(facecolor='orange', edgecolor='black'))
axes[i].set_title(f'{col}', fontsize=14)
axes[i].set_xlabel(f'Q1: {Q1:.2f}, Median: {median:.2f}, Q3: {Q3:.2f}', fontsize=10)
axes[i].set_ylabel('')
#Unnötige Achsen ausblenden, wenn die Spaltenanzahl ungerade ist
for j in range(num_cols, len(axes)):
axes[j].set_visible(False)
plt.tight_layout()
plt.show()
Für bestimmte Variablen wie: weekly Cases, Weekly Deaths, Daily Vaccinations, Daily People Vaccinated, Next Week's Deaths, stellt man fest, dass:
Die Werte stark um einen bestimmten Wert oder innerhalb eines bestimmten Intervalls konzentriert zu sein scheinen, und es eine große Anzahl von Ausreißern (Outliers) oberhalb der Whisker gibt. Diese Ausreißer werden durch Kreise dargestellt.
Die Box ist extrem klein, was darauf hinweist, dass der Interquartilsabstand (IQR) sehr schmal ist. Dies bedeutet, dass der Großteil der Daten in einem engen Bereich um den Median liegt.
Da die Whisker als der letzte Wert definiert sind, der innerhalb von *1,5xIQR oberhalb oder unterhalb der Quartile (Q1 und Q3) liegt, sind die Whisker bei einem sehr kleinen IQR und einer gleichzeitig sehr großen Wertebereich der Variable (wie z. B. bei Weekly Cases) sehr nahe an den Grenzen der Box oder sogar mit diesen verschmolzen (also schwer sichtbar).
Analyse der Verteilung der Variablen¶
# HISTOGRAMME DER VARIABLEN
cols_per_row = 2
num_cols = len([col for col in data.drop(["Location", "Id"], axis=1).columns] )
rows = (num_cols + cols_per_row - 1) // cols_per_row #Berechnung der Anzahl von erforderlichen Zeilen
fig, axes = plt.subplots(rows, cols_per_row, figsize=(12, 5 * rows))
axes = axes.flatten()
for i, col in enumerate(data.drop(["Location", "Id"], axis=1).columns) :
sns.histplot(ax = axes[i], x = data[col], bins=50, kde=True, color='chocolate')
axes[i].set_title(f'{col}', fontsize=14)
#Unnötige Achsen ausblenden, wenn die Spaltenanzahl ungerade ist
for j in range(num_cols, len(axes)):
axes[j].set_visible(False)
plt.tight_layout()
plt.show()
# SKEWNESS DER VARIABLEN
skewdata = data.drop("Location", axis=1)
skewness = skewdata.skew()
print(f"Skewness der Variablen(Spalten) :\n{skewness}" )
Skewness der Variablen(Spalten) : Id -0.000918 Weekly Cases 17.334228 Year 0.139635 Weekly Cases per Million 7.806967 Weekly Deaths 9.096170 Weekly Deaths per Million 8.303667 Total Vaccinations 7.061840 People Vaccinated 6.846799 People Fully Vaccinated 7.143399 Total Boosters 6.990664 Daily Vaccinations 9.282717 Total Vaccinations per Hundred 0.518582 People Vaccinated per Hundred -0.023551 People Fully Vaccinated per Hundred 0.150049 Total Boosters per Hundred 0.934193 Daily Vaccinations per Hundred 5.123234 Daily People Vaccinated 10.693151 Daily People Vaccinated per Hundred 13.667387 Next Week's Deaths 9.087042 dtype: float64
plt.figure(figsize=(8,5))
sns.barplot(x = skewness.index, y = skewness.values, color='green')
plt.title("Skewness plot der Attributen")
plt.xticks(rotation=90, ha='right')
plt.show()
# PROBABILITY PLOT
import scipy.stats as stats
cols_per_row = 2
num_cols = len([col for col in data.drop(["Location", "Id"], axis=1).columns] )
rows = (num_cols + cols_per_row - 1) // cols_per_row #Berechnung der Anzahl von erforderlichen Zeilen
fig, axes = plt.subplots(rows, cols_per_row, figsize=(12, 5 * rows))
axes = axes.flatten()
for i, col in enumerate(data.drop(["Location", "Id"], axis=1).columns) :
stats.probplot(data[col], dist="norm", plot=axes[i])
axes[i].set_title(f'{col}', fontsize=14)
#Unnötige Achsen ausblenden, wenn die Spaltenanzahl ungerade ist
for j in range(num_cols, len(axes)):
axes[j].set_visible(False)
plt.tight_layout()
plt.show()
Interpretation der Skewness-Werte:¶
- Eine Skewness nahe 0 zeigt eine symmetrische Verteilung an.
- Eine positive Skewness (> 0) weist auf eine Asymmetrie nach rechts hin (lange Schwanzverteilung zu den hohen Werten).
- Eine negative Skewness (< 0) weist auf eine Asymmetrie nach links hin (lange Schwanzverteilung zu den niedrigen Werten).
Allgemeine Schlussfolgerungen für die Variablen:¶
Asymmetrie nach rechts (Skewness > 0):¶
Die Mehrheit der Spalten weist eine hohe positive Skewness auf, was auf stark asymmetrische Verteilungen mit einer langen Schwanzverteilung zu hohen Werten hinweist.
Sehr asymmetrische Spalten (Skewness > 7):¶
Weekly Cases (17.33) Weekly Deaths (9.09) Daily People Vaccinated (10.69) Daily People Vaccinated per Hundred (13.67) Daily Vaccinations (9.28) Weekly Cases per Million, Total Vaccinations usw. haben ebenfalls hohe Skewness-Werte (> 7). Diese Werte zeigen den Einfluss einiger sehr hoher Beobachtungen (extreme Werte).
Leicht asymmetrische Spalten nach rechts (moderat hohe Skewness):¶
Total Vaccinations per Hundred (0.51) Total Boosters per Hundred (0.93) Diese Spalten zeigen eine moderate Asymmetrie, was darauf hindeutet, dass ihre Verteilungen weniger extrem sind, aber immer noch nicht perfekt symmetrisch.
Asymmetrie nach links (Skewness < 0):¶
People Vaccinated per Hundred (-0.02) Die Skewness ist sehr nahe bei 0, was auf eine nahezu symmetrische Verteilung für diese Spalte hinweist.
------------------------------------------------------------------------------------------------------------------------------¶
Probability plot¶
Achsen des Diagramms:¶
- *X (theoretische Quantile)*: Dies sind die Quantile einer Standardnormalverteilung (oder einer anderen angegebenen Verteilung).
- *Y (geordneten Werte)*: Dies sind die sortierten Daten aus der Stichprobe.
*Rote Linie (Referenzlinie)*: Sie stellt eine ideale Normalverteilung dar. Wenn die blauen Punkte der roten Linie folgen, sind die Daten nahe an der Normalverteilung.
Abweichungen von der Linie:¶
Punkte, die auf der roten Linie ausgerichtet sind: Die Daten folgen gut der Normalverteilung. Punkte, die sich von der roten Linie entfernen: Die Daten folgen keiner Normalverteilung.
Nach dieser Analyse:¶
Stellt man fest, dass fast keine Variable im Datensatz einer Normalverteilung folgt, d. h. die Verteilungen sind asymmetrisch um die Mittelwerte.
I-II. Inhaltsanalyse:¶
Beziehungen zwischen unabhängigen Variablen und Zielvariable¶
data
| Id | Location | Weekly Cases | Year | Weekly Cases per Million | Weekly Deaths | Weekly Deaths per Million | Total Vaccinations | People Vaccinated | People Fully Vaccinated | Total Boosters | Daily Vaccinations | Total Vaccinations per Hundred | People Vaccinated per Hundred | People Fully Vaccinated per Hundred | Total Boosters per Hundred | Daily Vaccinations per Hundred | Daily People Vaccinated | Daily People Vaccinated per Hundred | Next Week's Deaths | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 911530868 | World | 2372.0 | 2020 | 0.300 | 65.0 | 0.008 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 344.0 |
| 1 | 807936902 | World | 5023.0 | 2020 | 0.635 | 114.0 | 0.014 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 361.0 |
| 2 | 773590408 | World | 5612.0 | 2020 | 0.710 | 116.0 | 0.015 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 431.0 |
| 3 | 130466459 | World | 7580.0 | 2020 | 0.958 | 153.0 | 0.019 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 463.0 |
| 4 | 544040446 | World | 8983.0 | 2020 | 1.136 | 187.0 | 0.024 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 506.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 129151 | 541829605 | Zimbabwe | 464.0 | 2022 | 29.012 | 13.0 | 0.813 | 11949993.0 | 6297324.0 | 4601845.0 | 1050824.0 | 5665.0 | 74.72 | 39.37 | 28.77 | 6.57 | 354.0 | 1427.0 | 0.009 | 9.0 |
| 129152 | 969939474 | Zimbabwe | 471.0 | 2022 | 29.449 | 12.0 | 0.750 | 11958771.0 | 6299348.0 | 4605821.0 | 1053602.0 | 5295.0 | 74.77 | 39.39 | 28.80 | 6.59 | 331.0 | 1362.0 | 0.009 | 7.0 |
| 129153 | 667902340 | Zimbabwe | 450.0 | 2022 | 28.136 | 13.0 | 0.813 | NaN | NaN | NaN | NaN | 5316.0 | NaN | NaN | NaN | NaN | 332.0 | 1483.0 | 0.009 | 5.0 |
| 129154 | 961193720 | Zimbabwe | 277.0 | 2022 | 17.320 | 6.0 | 0.375 | 11974313.0 | 6305470.0 | 4611113.0 | 1057730.0 | 5358.0 | 74.87 | 39.43 | 28.83 | 6.61 | 335.0 | 1633.0 | 0.010 | 7.0 |
| 129155 | 832612563 | Zimbabwe | 277.0 | 2022 | 17.320 | 6.0 | 0.375 | 11984914.0 | 6310089.0 | 4614738.0 | 1060087.0 | 6190.0 | 74.94 | 39.45 | 28.85 | 6.63 | 387.0 | 2102.0 | 0.013 | 8.0 |
129156 rows × 20 columns
unab_variablen = data.drop(["Id", "Next Week's Deaths"], axis=1)
target = data["Next Week's Deaths"]
cols_per_row = 2
num_cols = len([col for col in unab_variablen.columns] )
rows = (num_cols + cols_per_row - 1) // cols_per_row #Berechnung der Anzahl von erforderlichen Zeilen
fig, axes = plt.subplots(rows, cols_per_row, figsize=(12, 5 * rows))
axes = axes.flatten()
for i, col in enumerate(unab_variablen.columns):
sns.scatterplot(ax = axes[i], x=unab_variablen[col], y=target)
axes[i].set_title(f"{col} vs. Next Week's Deaths")
axes[i].set_xlabel(f"{col}")
axes[i].set_ylabel("Next Week's Deaths")
#Unnötige Achsen ausblenden, wenn die Spaltenanzahl ungerade ist
for j in range(num_cols, len(axes)):
axes[j].set_visible(False)
plt.tight_layout()
plt.show()
correlation_matrix = data.drop('Location',axis=1).corr()
correlations_with_target = correlation_matrix["Next Week's Deaths"].drop("Next Week's Deaths")
plt.figure(figsize=(10,5))
sns.barplot(x= correlations_with_target.index, y=correlations_with_target.values, color = 'violet')
plt.title("Korrelationsplot Der Variablen gegen Next Week's Deaths")
plt.xticks(rotation=90, ha='right')
plt.show()
Beziehungen zwischen unabhängigen Variablen¶
#Copie der Originalen datensatz
df = data.copy()
# Löschen der NaN-Wette, weil sns.pairplot() ist sehr zeitaufwendig, insbesondere wenn es viele Zeilen gibt.
df.dropna(axis=0, inplace=True)
#df.drop("Id", axis=1, inplace=True)
df.head()
| Id | Location | Weekly Cases | Year | Weekly Cases per Million | Weekly Deaths | Weekly Deaths per Million | Total Vaccinations | People Vaccinated | People Fully Vaccinated | Total Boosters | Daily Vaccinations | Total Vaccinations per Hundred | People Vaccinated per Hundred | People Fully Vaccinated per Hundred | Total Boosters per Hundred | Daily Vaccinations per Hundred | Daily People Vaccinated | Daily People Vaccinated per Hundred | Next Week's Deaths | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 241 | 275164452 | World | 4174523.0 | 2020 | 527.800 | 77527.0 | 9.802 | 11875406.0 | 7231498.0 | 44680.0 | 1.0 | 897447.0 | 0.15 | 0.09 | 0.00 | 0.0 | 113.0 | 690726.0 | 0.009 | 81042.0 |
| 242 | 857254713 | World | 4424216.0 | 2021 | 559.369 | 79456.0 | 10.046 | 13722790.0 | 9050886.0 | 58460.0 | 9.0 | 1079269.0 | 0.17 | 0.11 | 0.00 | 0.0 | 136.0 | 735617.0 | 0.009 | 92754.0 |
| 243 | 515683834 | World | 4553174.0 | 2021 | 575.674 | 80332.0 | 10.157 | 17002186.0 | 11343354.0 | 191881.0 | 15.0 | 1303377.0 | 0.21 | 0.14 | 0.00 | 0.0 | 165.0 | 851085.0 | 0.011 | 94477.0 |
| 244 | 725478352 | World | 4619286.0 | 2021 | 584.033 | 79640.0 | 10.069 | 18569106.0 | 12578084.0 | 366880.0 | 23.0 | 1397939.0 | 0.23 | 0.16 | 0.00 | 0.0 | 177.0 | 845521.0 | 0.011 | 96212.0 |
| 245 | 844503137 | World | 4649535.0 | 2021 | 587.857 | 81042.0 | 10.246 | 20361402.0 | 14002427.0 | 650359.0 | 27.0 | 1581369.0 | 0.26 | 0.18 | 0.01 | 0.0 | 200.0 | 928498.0 | 0.012 | 96742.0 |
#Darstellung der Korrelation
sns.pairplot(data=df, hue='Year')
<seaborn.axisgrid.PairGrid at 0x13a9ef5bfd0>